package com.mastercard.assets.web.struts.actions;

import com.mastercard.assets.jpa.TblAgencia;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.mastercard.assets.jpa.TblCategoria;
import com.mastercard.assets.jpa.TblFlujo;
import com.mastercard.assets.jpa.TblFlujoAutorizacion;
import com.mastercard.assets.jpa.TblUsuario;
import com.mastercard.assets.jpa.TblSubcateg;
import com.mastercard.assets.util.MCUtil;
import com.mastercard.assets.util.dao.MasterCardDAO;
import com.mastercard.assets.web.struts.forms.AssetAltaForm;
import com.mastercard.assets.web.util.to.UserLogin;

public class AssetsAlta
	extends
		Action
{
	public ActionForward execute(
							ActionMapping mapping , 
							ActionForm form ,
							HttpServletRequest request , 
							HttpServletResponse response )
		throws 
			IOException , 
			ServletException
	{
		HttpSession session = request.getSession( ) ;
		
		// en caos de null
		if( session == null )
			return mapping.findForward( "noLogin" ) ;
		
		// toma el userLogin
		UserLogin user = ( UserLogin ) session.getAttribute( "UserLogin" ) ;
		int roleId = user.getActualRoleId( ) ;
		int cveUsuario = user.getCveUsuario() ;
                TblUsuario userData = MasterCardDAO.findUserById( cveUsuario ) ;
                String codigoPais = userData.getTblPais().getCodigo();
                String nombrePais = userData.getTblPais().getNombre();
                int cvePais = userData.getTblPais().getCvePais();
                
                if( roleId == 6 ) {
                    codigoPais = "Regional" ;
                    nombrePais = "Regional" ;
                    cvePais = 17 ;
                }
                
		// en caso de null
		if( user == null ) {
                    MasterCardDAO.closeEntityManager( ) ;
                    return mapping.findForward( "noLogin" ) ;
                }                        
		
		try
		{
			List< TblCategoria > categs = MasterCardDAO.getAllActiveCategorias( ) ;
			
			// en cso de que no haya registros
			if( categs == null || categs.size( ) == 0 )
			{
				// en caso de que se cumpla, guarda el WorkArea
				user.setNextWorkArea( "/WEB-INF/pages/WorkArea/AssetsIndex.jsp" ) ;
				
				user.setMessageError( MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.usuario.ThereIsNotCategoryRegs" ) ) ;
				
                                MasterCardDAO.closeEntityManager( ) ;
			  	return mapping.findForward( "success" ) ;
			}
			
			List< TblCategoria > resCateg = new ArrayList< TblCategoria >( ) ;
			
			// quita aquellos uqe no tengan subcategorias
			for( TblCategoria categ : categs )
			{
				// toma las subcateg
				List< TblSubcateg > categSubcateg = categ.getTblSubcategs( ) ;
				
				// en csao de null o 0
				if( categSubcateg != null && categSubcateg.size( ) > 0 )
					resCateg.add( categ ) ;
			}
			
			// en cso de que no haya registros
			if( resCateg.size( ) == 0 )
			{
				// en caso de que se cumpla, guarda el WorkArea
				user.setNextWorkArea( "/WEB-INF/pages/WorkArea/AssetsIndex.jsp" ) ;
				
				user.setMessageError( MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.usuario.ThereIsNotCategoryWithSubcategoriesRegs" ) ) ;
				
                                MasterCardDAO.closeEntityManager( ) ;
			  	return mapping.findForward( "success" ) ;
			}
			
			// en caso de que solamante haya un registro
			if( resCateg.size( ) == 1 )
			{
				TblCategoria categ = resCateg.get( 0 ) ;
				int cveCategoria = categ.getCveCategoria( ) ;
				
				List< TblSubcateg > resCategSubcate = MasterCardDAO.getAllActiveSubcategoryFromCategory( cveCategoria ) ;
//				resCateg.get( 0 ).getTblSubcategs( ) ;
				
				// coloca los regs de las subcategorias
				request.setAttribute( "Subcategorias" , resCategSubcate ) ;
				
				AssetAltaForm f = new AssetAltaForm( ) ;
				f.setCategoria( resCateg.get( 0 ).getCveCategoria( ) ) ;
				// en csao de que solamente sea una subcategoria
				if( resCategSubcate.size( ) == 1 )
					f.setSubcategoria( resCategSubcate.get( 0 ).getCveSubcateg( ) ) ;
				
				request.setAttribute( "AssetAltaForm" , f ) ;
			}
			else
				// coloca los regs de las subcategorias
				request.setAttribute( "Subcategorias" , new ArrayList< TblSubcateg >( ) ) ;
			
			// levanta los flujos de tipo implementacion
			List< TblFlujo > flujosImplementacion = MasterCardDAO.getAllActiveImplementationFlows( ) ;
			// levanta los flujos de tipo campania
			List< TblFlujo > flujosCampania = MasterCardDAO.getAllActiveCampaignFlows( ) ;
                        // levanta las agencias
			List< TblAgencia > agenciaLista = MasterCardDAO.getAllActiveAgencies( ) ;
                        List< TblFlujoAutorizacion > lfa = MasterCardDAO.getAllFlujosAut( ) ;
			// en caso de que no haya flujos no hay problema, puesto que el asset se queda asi y en la edicion puede asignarle el flujo
			
			request.setAttribute( "FlujosImplementacion" , flujosImplementacion ) ;
			request.setAttribute( "FlujosCampania" , flujosCampania ) ;
                        request.setAttribute( "Agencias" , agenciaLista ) ;
                        request.setAttribute( "FlujosAut" , lfa ) ;
			
			
			
			// levanta las categorias
			request.setAttribute( "roleId" , roleId ) ;
                        request.setAttribute( "cvePais" , cvePais ) ;
			request.setAttribute( "nombrePais" , nombrePais ) ;
			request.setAttribute( "codigoPais" , codigoPais ) ;
			request.setAttribute( "Categorias" , resCateg ) ;
		}catch( Exception e )
		{
			request.setAttribute( "Categorias" , new ArrayList< TblCategoria >( ) ) ;
		}
		
		// en caso de que se cumpla, guarda el WorkArea
		user.setNextWorkArea( "/WEB-INF/pages/WorkArea/AssetsAlta.jsp" ) ;
		
		user.clearMessageError( ) ;
		
                MasterCardDAO.closeEntityManager( ) ;
	  	return mapping.findForward( "success" ) ;
	}
	
}
